/*************************************************************************
	> File Name: class_friend.cc
	> Author: likang
	> Mail:  
	> Created Time: 2014年12月27日 星期六 20时41分10秒
 ************************************************************************/

#include<iostream>
using namespace std;

class A;

class B {
	public:
		int addage(int ad, A &a);
		string modifyname(A &a);
};

class A {
	public:

		//friend class B;                  //整个类都是友元，它的所有成员函数都可以访问授予友元关系的那个类的非公有成员

		//class B 必须在A类之前定义，因为B类中也用到A类，所以在最开始声明A，此时仅addage可以访问A中的私有成员，modifyname会报错
		friend int B::addage(int ad, A &a);

		//友元函数可以在类的内部定义，该函数的作用域扩展到包围该类定义的作用域
		friend void f(A &a) {
			cout << a.age << a.name << endl;
		}

		A(int a, string nm):age(a),name(nm) {}
	private:
		int age;
		string name;
};

int B::addage(int ad ,A &a) {
	a.age = a.age + ad;
	return a.age;
}

/*
string B::modifyname(A &a) {
	return a.name.append("**");
}
*/

int main(void) {
	A a(10,"lk");
	B b;
	int age = b.addage(10,a);
	//string nm = b.modifyname(a);
	cout << age << endl;
	//cout << nm << endl;
	f(a);
	return 0;
}
